﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using DAL.Entity;

namespace DAL.Persistencia
{
    public class TarifaDAL
    {
        NewTierraEntities Con = new NewTierraEntities();

        //Metodo para listar todos os S_Mercado_Periodo cadastrados com inner join
        public object ListarTarifasParaCopiar(Int32 supplierID,Int32 mercadoID,Int32 mercadoEstacaoID, Int32 periodoID)
        {
            try
            {
                var query = from mt in Con.S_Mercado_Tarifa
                            join tr in Con.Tipo_Room on mt.Tipo_room_id equals tr.Tipo_room_id
                            join mts in Con.S_Mercado_Tarifa_Status on mt.S_merc_tarif_status_id equals mts.S_mercado_tarifa_status_id into joinDeptEmp
                            from m in joinDeptEmp.DefaultIfEmpty()
                            join tc in Con.Tarif_Categoria on mt.Tarif_categoria_id equals tc.Tarif_categoria_id
                            join mtt in Con.S_Mercado_Tipo_Tarifa on mt.S_mercado_tipo_tarifa_id equals mtt.S_mercado_tipo_tarifa_id
                            join mp in Con.S_Mercado_Periodo on mt.S_merc_periodo_id equals mp.S_merc_periodo_id
                            where mp.S_id == supplierID && mp.Mercado_id == mercadoID && mp.S_mercado_estacao_id == mercadoEstacaoID
                                  && mp.S_merc_periodo_id == periodoID
                            select new
                            {
                                mt.S_merc_tarif_tarifa,
                                tr.Tipo_room_nome,
                                mtt.S_mercado_tipo_tarifa_nome,
                                m.S_mercado_tarifa_status_nome,
                                //mts.S_mercado_tarifa_status_nome,
                                tc.Tarif_categoria_nome,
                                //S_Mercado_Estacao.S_mercado_estacao_nome,
                                mt.S_merc_tarif_id
                            };
                return query.ToList();
            }
            catch
            {
                throw;
            }
        }

        public bool VerificaPeriodoExistente(DateTime dataFrom, DateTime dataTo, int Sid, int mercadoID)
        {
            try
            {
                var Periodo = from mp in Con.S_Mercado_Periodo
                              where mp.S_id == Sid &&
                                    mp.S_merc_periodo_from == dataFrom &&
                                    mp.S_merc_periodo_to == dataTo &&
                                    mp.Mercado_id == mercadoID
                              select new 
                              {
                                  mp.S_merc_periodo_id
                              };

                if (Periodo.Count() == 0)
                {
                    return false;
                }
                    else
                {
                    return true;
                }

                //return Periodo.ToList();

            }
            catch
            {
                
                throw;
            }
           
        }

        public object ListarTodos(Int32 PeriodoID)
        {
            try
            {
                var query = from mtt in Con.S_Mercado_Tipo_Tarifa
                            join mt in Con.S_Mercado_Tarifa on mtt.S_mercado_tipo_tarifa_id equals mt.S_mercado_tipo_tarifa_id
                            join tr in Con.Tipo_Room on mt.Tipo_room_id equals tr.Tipo_room_id
                            join tc in Con.Tarif_Categoria on mt.Tarif_categoria_id equals tc.Tarif_categoria_id
                            join mts in Con.S_Mercado_Tarifa_Status on mt.S_merc_tarif_status_id equals mts.S_mercado_tarifa_status_id into leftjoin
                            from lf in leftjoin.DefaultIfEmpty()
                            where mt.S_merc_periodo_id == PeriodoID
                            orderby tc.Tarif_categoria_nome ascending
                            select new
                            {
                                mt.S_merc_tarif_tarifa_total,
                                mt.S_merc_tarif_id,
                                tr.Tipo_room_nome,
                                tc.Tarif_categoria_nome,
                                mtt.S_mercado_tipo_tarifa_nome,
                                lf.S_mercado_tarifa_status_nome,
                                mt.S_merc_tarif_tarifa
                            };

                    return query.ToList();

            }
            catch
            {
                
                throw;
            }
        }

        public object ListarTodosOrdenado(Int32 PeriodoID, string ordem)
        {
            try
            {

                   var query = from mtt in Con.S_Mercado_Tipo_Tarifa
                                join mt in Con.S_Mercado_Tarifa on mtt.S_mercado_tipo_tarifa_id equals mt.S_mercado_tipo_tarifa_id
                                join tr in Con.Tipo_Room on mt.Tipo_room_id equals tr.Tipo_room_id
                                join tc in Con.Tarif_Categoria on mt.Tarif_categoria_id equals tc.Tarif_categoria_id
                                join mts in Con.S_Mercado_Tarifa_Status on mt.S_merc_tarif_status_id equals mts.S_mercado_tarifa_status_id into leftjoin
                                from lf in leftjoin.DefaultIfEmpty()
                                where mt.S_merc_periodo_id == PeriodoID
                                orderby tc.Tarif_categoria_nome ascending
                                select new
                                {
                                    mt.S_merc_tarif_tarifa_total,
                                    mt.S_merc_tarif_id,
                                    tr.Tipo_room_nome,
                                    tc.Tarif_categoria_nome,
                                    mtt.S_mercado_tipo_tarifa_nome,
                                    lf.S_mercado_tarifa_status_nome,
                                    mt.S_merc_tarif_tarifa
                                };

                   var query2 = from mtt in Con.S_Mercado_Tipo_Tarifa
                                 join mt in Con.S_Mercado_Tarifa on mtt.S_mercado_tipo_tarifa_id equals mt.S_mercado_tipo_tarifa_id
                                 join tr in Con.Tipo_Room on mt.Tipo_room_id equals tr.Tipo_room_id
                                 join tc in Con.Tarif_Categoria on mt.Tarif_categoria_id equals tc.Tarif_categoria_id
                                 join mts in Con.S_Mercado_Tarifa_Status on mt.S_merc_tarif_status_id equals mts.S_mercado_tarifa_status_id into leftjoin
                                 from lf in leftjoin.DefaultIfEmpty()
                                 where mt.S_merc_periodo_id == PeriodoID
                                 orderby mt.S_merc_tarif_tarifa_total descending
                                 select new
                                 {
                                     mt.S_merc_tarif_tarifa_total,
                                     mt.S_merc_tarif_id,
                                     tr.Tipo_room_nome,
                                     tc.Tarif_categoria_nome,
                                     mtt.S_mercado_tipo_tarifa_nome,
                                     lf.S_mercado_tarifa_status_nome,
                                     mt.S_merc_tarif_tarifa
                                 };

                if(ordem.Equals("Nome"))
                {
                    return query.ToList();
                }
                else 
                {
                    return query2.ToList();
                }

            }
            catch
            {

                throw;
            }
        }

        public object ListarTodos(Int32 PeriodoID, string multiplica)
        {
            try
            {

                var query = from mtt in Con.S_Mercado_Tipo_Tarifa
                            join mt in Con.S_Mercado_Tarifa on mtt.S_mercado_tipo_tarifa_id equals mt.S_mercado_tipo_tarifa_id
                            join tr in Con.Tipo_Room on mt.Tipo_room_id equals tr.Tipo_room_id
                            join tc in Con.Tarif_Categoria on mt.Tarif_categoria_id equals tc.Tarif_categoria_id
                            join mts in Con.S_Mercado_Tarifa_Status on mt.S_merc_tarif_status_id equals mts.S_mercado_tarifa_status_id into leftjoin
                            from lf in leftjoin.DefaultIfEmpty()
                            where mt.S_merc_periodo_id == PeriodoID
                            orderby tc.Tarif_categoria_nome ascending
                            select new
                            {
                                S_merc_tarif_tarifa_total = tr.Tipo_room_nome.Equals("Single")    ? mt.S_merc_tarif_tarifa_total     :
                                                            tr.Tipo_room_nome.Equals("Double")    ? mt.S_merc_tarif_tarifa_total * 2 :
                                                            tr.Tipo_room_nome.Equals("Triple")    ? mt.S_merc_tarif_tarifa_total * 3 :
                                                            tr.Tipo_room_nome.Equals("Quadruple") ? mt.S_merc_tarif_tarifa_total * 4 :
                                mt.S_merc_tarif_id,
                                tr.Tipo_room_nome,
                                tc.Tarif_categoria_nome,
                                mtt.S_mercado_tipo_tarifa_nome,
                                lf.S_mercado_tarifa_status_nome,
                                mt.S_merc_tarif_tarifa
                            };

                return query.ToList();
            }
            catch
            {

                throw;
            }
        }

        public List<S_Mercado_Tarifa> ListarTodos()
        {
            try
            {
                using (NewTierraEntities Con = new NewTierraEntities())
                {
                    return Con.S_Mercado_Tarifa.ToList();
                }
            }
            catch
            {
                throw;
            }
        }

        public List<S_Mercado_Tarifa> ListarTodosLista(int IdPeriodo)
        {
            try
            {
                using (NewTierraEntities Con = new NewTierraEntities())
                {
                    return Con.S_Mercado_Tarifa.Where(t => t.S_merc_periodo_id == IdPeriodo).ToList();
                }
            }
            catch
            {
                throw;
            }
        }

        public S_Mercado_Tarifa ObterPorId(int tarifaID)
        {
            try
            {
                //select * from S_Mercado_Tarifa where tarifaID = ?
                return Con.S_Mercado_Tarifa.Where(c => c.S_merc_tarif_id == tarifaID).Single();

                //Single -> Retorna apenas 1 Registro e dá erro para qualquer
                //          resultado diferente de 1 Registro.
            }
            catch
            {
                throw;
            }
        }

        public bool VerificaTarifaExistente(int IdPeriodo)
        {
            using (NewTierraEntities Con = new NewTierraEntities())
            {
               return Con.S_Mercado_Tarifa.Where(t => t.S_merc_periodo_id == IdPeriodo).Count() != 0;
            }
        }

        public void Atualizar(S_Mercado_Tarifa registroNovo)
        {
            try
            {

                //Buscar na base de dados registro antigo
                S_Mercado_Tarifa registroAntigo = ObterPorId(registroNovo.S_merc_tarif_id);

                //Atualizando os dados
                registroAntigo.S_merc_tarif_tarifa = registroNovo.S_merc_tarif_tarifa;
                registroAntigo.S_merc_tarif_tarifa_total = registroNovo.S_merc_tarif_tarifa_total;
                registroAntigo.S_merc_tarif_porc_taxa = registroNovo.S_merc_tarif_porc_taxa;
                registroAntigo.S_merca_tarif_porc_imposto = registroNovo.S_merca_tarif_porc_imposto;
                registroAntigo.S_merca_tarif_porc_comissao = registroNovo.S_merca_tarif_porc_comissao;
                registroAntigo.S_merc_tarif_status_id = registroNovo.S_merc_tarif_status_id;
                registroAntigo.Tipo_room_id = registroNovo.Tipo_room_id;
                registroAntigo.Tarif_categoria_id = registroNovo.Tarif_categoria_id;
                registroAntigo.S_mercado_tipo_tarifa_id = registroNovo.S_mercado_tipo_tarifa_id;
                registroAntigo.S_merc_periodo_id = registroNovo.S_merc_periodo_id;

                //executa o commit
                Con.SaveChanges();
            }
            catch
            {
                throw;
            }

        }

        public void Excluir(S_Mercado_Tarifa c)
        {
            try
            {
                Con.DeleteObject(c); //Prepara a deleção da S_Mercado_Tarifa
                Con.SaveChanges(); //Executa a transação (commit)
            }
            catch
            {
                throw;
            }
        }

    }
}
